package com.example.demo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.Duration;

@Slf4j
@RestController
@CrossOrigin(origins = "http://localhost:63342")
public class SseController {


//    由于 take(4) 会使 Flux 流在发出 4 个元素后就结束，这可能会导致前端 EventSource 认为连接出现异常。
//    因为 EventSource 通常期望连接是持续的，当流突然结束时，它可能会触发 onerror 事件，并尝试重新连接。

    @GetMapping(path = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> streamEvents() {
        return Flux.interval(Duration.ofSeconds(3))
//                .take(4)
                .map(index -> ServerSentEvent.<String>builder()
                        .data("Test sse")
                        .build()).doOnComplete(() -> log.info("SSE stream completed."));
    }
}